#ifndef __PARSER_H__
#define __PARSER_H__

#include <iostream>
#include <sstream>

#include "Tag.h"
#include "Lista.h"
#include "IteradorLista.h"
#include "ComparadorString.h"
#include "Logger.h"
#include "ArchivoLecturaSecuencial.h"



enum TipoPalabra { NAME, VALUE, SEPARATOR };

class Parser{

	private : 
		static Lista<string>* closingTags;
		static ArchivoLecturaSecuencial* xml;

		Parser(){}

		static void appendChildren(ArchivoLecturaSecuencial* xml, Tag* father);

		/*
		 * Chequea si el header pasado es un tag de cierre. Si es asi verifica que sea el 
		 * tag de cierre que corresponde mediante la lista, de lo contrario anota un warning.
		 */
		static bool isClosingTag(string* header);

		static void popClosingTagsUpTo(int indicePrimero);

		/*
		 * Extrae el string con el encabezado. Devuelve true si tag termina en el encabezado (cerrado son '/>').
		 */
		static bool extraerEncabezado(ArchivoLecturaSecuencial* xml, string* atributos);
		static string TipoPalabraToString(TipoPalabra tipo);

		/*
		 * Posiciona el lector en el siguiente caracter a alguno de los simbolos o al final del archivo.
		 */
		static void escaparHasta(ArchivoLecturaSecuencial* archivo, char simbolos[] ,int cantidadSimbolos);

		static void cargarAtributos(Tag* tag, string* atributos,bool esAutocontenido);

		static void quitarComillas(string& palabra);

		static TipoPalabra clasificarPalabra(string palabra);

		static Lista<string>* extraerPalabras(string* atributos);

		static void extraerPalabra(string* frase, string* palabra);

		/*
		 * Coloca el indice de la cadena en la ultima posicion con un simbolo igual a los pasados.
		 */
		static void escapar(char simbolos[], int cantidadSimbolos, int &indice, string* cadena);

		/*
		 * Coloca el indice de la cadena en la ultima posicion con un simbolo igual a alguno de los pasados.
		 */
		static void escaparHasta(char simbolos[], int cantidadSimbolos, int &indice, string* cadena);

		/*
		 * Quita los espacios en blanco al ppio de la cadena.
		 */
		static void frontTrim(string* cadena);

		/*
		 * Quita los espacios en blanco al final de la cadena.
		 */
		static void backTrim(string* cadena);

		/*
		 * Quita los espacios en blanco de la cadena.
		 */
		static void trim(string* cadena);

		/*
		 * Copia una subcadena, quitandola de la original.
		 */
		static void copiarYQuitar(string* original, string* copia, int desde, int hasta);

		/*
		 * Borra la porcion de cadena especificada.
		 */
		static void borrar(string* cadena, int desde, int hasta);

	public:

		static Tag* parse(string xmlPath);

		~Parser(void);
};

#endif